#include <iostream>
#include <cstring>

class Matrix {
private:
    int rows, cols;
    double* data;

public:
    // 构造函数
    Matrix(int r, int c) : rows(r), cols(c) {
        data = new double[rows * cols];  // 为矩阵数据分配内存
    }

    // 拷贝构造函数
    Matrix(const Matrix& other) : rows(other.rows), cols(other.cols) {
        data = new double[rows * cols];  // 为拷贝的数据分配新的内存空间
        std::memcpy(data, other.data, rows * cols * sizeof(double));  // 深拷贝数据
    }

    // 析构函数
    ~Matrix() {
        delete[] data;  // 释放分配的内存
    }

    // 设置矩阵中的某个元素
    void set(int row, int col, double value) {
        if (row >= 0 && row < rows && col >= 0 && col < cols) {
            data[row * cols + col] = value;
        }
    }

    // 获取矩阵中的某个元素
    double get(int row, int col) const {
        if (row >= 0 && row < rows && col >= 0 && col < cols) {
            return data[row * cols + col];
        }
        return 0;  // 越界返回0
    }

    // 打印矩阵内容
    void print() const {
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                std::cout << data[i * cols + j] << " ";
            }
            std::cout << std::endl;
        }
    }
};

int main() {
    Matrix mat1(2, 2);
    mat1.set(0, 0, 1.0);
    mat1.set(0, 1, 2.0);
    mat1.set(1, 0, 3.0);
    mat1.set(1, 1, 4.0);

    Matrix mat2 = mat1;  // 使用拷贝构造函数创建mat2

    std::cout << "Original Matrix:" << std::endl;
    mat1.print();
    std::cout << "Copied Matrix:" << std::endl;
    mat2.print();

    return 0;
}